const localStorage = window.localStorage;

// 普通方式实现
class Storage {
  static getInstance() {
    // 先判断是否new过一个对象，没有则new，有则直接返回
    if(!Storage.instance) {
      // 若这个唯一的实例不存在，那么先创建它
      Storage.instance = new Storage();
    }

    // 如果这个唯一的实例已经存在，则直接返回
    return Storage.instance;
  }

  getItem(key) {
    return localStorage.getItem(key);
  }
  setItem(key, value) {
    return localStorage.setItem(key, value);
  }
}

let s1 = Storage.getInstance();
let s2 = Storage.getInstance();

console.log(s1 == s2);

// 闭包方式实现
// 先实现一个基础的StorageBase类，把getItem和setItem方法放在它的原型链上
function StorageBase() {}

StorageBase.prototype.getItem = function(key) {
  return localStorage.getItem(key);
}
StorageBase.prototype.setItem = function(key, value) {
  return localStorage.getItem(key, value);
}

// 以闭包的形式创建一个引用自由变量的构造函数
const StorageNew = (function() {
  let instance = null;
  return function() {
    if(!instance) {
      // 如果为null则new出唯一实例, 为什么会new出唯一实例呢？
      instance = new StorageBase();
    }

    return instance;
  }
})(); // 立即执行函数？
// 这里其实不用 new Storage 的形式调用，直接 Storage() 也会有一样的效果 
const storage3 = new StorageNew()
const storage4 = new StorageNew()

storage3.setItem('name', '李雷')
// 李雷
storage3.getItem('name')
// 也是李雷
storage4.getItem('name')

// 返回true
console.log(storage3 === storage4);